/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpr.inf.escel.brain.model.po;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author gustavo
 */
public class Metodo {

    private String metodo;
    private int indiceMetodo;

    public Metodo() {
    }

    public Metodo(String metodo) {
        this.metodo = metodo;
    }

    public Metodo(String metodo, int indice) {
        this.metodo = metodo;
        this.indiceMetodo = indice;
    }

    /**
     * Verifica se o metodo que foi passado, tem algum
     * parâmetro. obs: só será utilizado em PO
     *
     * @param metodo
     * @since 3.4
     * @return true | false
     */
    public boolean hasParametro() {
        Pattern p = Pattern.compile("\\((I|Object|String|F|C)+\\)");
        Matcher m = null;
        try {
            m = p.matcher(metodo);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return  m.find();
    }

    /**
     * Retorna o inteiro corresponde ao vetor inicial dos metodos
     * @return
     * @since 3.4
     */
    public int indice() {
        return indiceMetodo;
    }

    /**
     * Extrai os valores entre parenteres do metodo
     * ex: s.swap(II) -> II
     * @return II
     * @since 3.4
     */
    public String extrairParametros() {

        if (metodo.contains("(") && metodo.contains(")")) {
            return metodo.split("\\(")[1].replaceAll("\\)", "");
        }
        return "";
    }

    /**
     * Numero de parametros que existem para esse metodo
     * @return int parametros
     * @since 3.4
     */
    public int quantidadeParametros() {

        int quantidade = 0;

        String valores = extrairParametros();

        for (int i = 0; i < valores.length(); i++) {
            switch (valores.charAt(i)) {
                case 'I':
                    quantidade++;
                    break;
                case 'F':
                    quantidade++;
                    break;
                case 'C':
                    quantidade++;
                    break;
                case 'S':
                    quantidade++;
                    break;
                case 'O':
                    quantidade++;
                    break;
            }
        }

        return quantidade;
    }

    /**
     * Pega a variavel que serve como referencia à chamada de metodo
     * ex: $x.swap(II) -> x
     * @return char at point 1
     */
    public char getChar() {
        return metodo.charAt(1);
    }

    @Override
    public String toString() {
        return metodo;
    }
}
